Operator CxpCameraMultiTap

Operator Library: Hardware Platform

该算子代表 CXP 双抽头(tap)相机与 VisualApplets 之间的图像数据接口。您可以将该算子用于单通道、双通道或四通道 CXP 接口。您可以通过参数 ConnectionCount 选择接口类型。无论相机输出哪种格式,该算子都会为每个 tap 端口输出原始图像数据。然后,您需要将这些图像数据转换为相机发送的格式。若要转换图像数据,请使用适当的算子来进行聚合,并将原始字节值转换(cast)为像素值。运行过程中的某些特定情况可能会通过事件系统进行通报,如下所述。此外,该算子还具有多个用于指示与相机连接状态的参数。

适用于以下硬件平台
imaFlex CXP-12 Penta
imaFlex CXP-12 Quad

CXP 标准多抽头(Multi-Tap)定义

通常,图像像素是从左上角到右下角按顺序扫描的。然而,随着现代图像传感器上的像素数量稳步增长,这种方法已无法产生可接受的帧率。为了解决这个问题,传感器制造商通过同时扫描多个像素来应对。CXP 标准通过引入 抽头(tap) 的概念来适应这种技术。抽头可以看作是一个按顺序读取图像像素的扫描设备。图像的扫描方式定义为 Tap Geometry,由主机从设备中读取。

[注意] 抽头仅适用于垂直扫描

抽头仅适用于垂直扫描。水平扫描固定为从左到右。

CXP 标准建议帧抓取器主机支持三种 tap 格式:1X-1Y、1X-1Y2 和 1X-2YE。tap 格式 1X-1Y 代表从左上角到右下角逐像素扫描的默认特征,而其他格式则代表下图所示的两种 tap 几何结构:

尽管来自每个 tap 的数据被组合成单独的数据流,但需要注意的是,流 ID 与 tap 之间没有固定的映射关系。不过,可以放心地假设此映射在采集过程中保持不变。 TapG 代码,从而获取查找此映射所需的信息,该信息包含在 CXP 图像标头中,可在可选的 MetaDataTap0/1 端口上读取。

Tap 格式 TapG 代码
1X-1Y 0x0000
1X-1Y2, tap 1 0x0004
1X-1Y2, tap 2 0x1004
1X-2YE, tap 1 0x0041
1X-2YE, tap 2 0x1041
[注意] 翻转图像下半部分不是该 Operator 的职责

对于 1X-2YE 抽头格式,翻转图像下半部分不是该 CxpCameraMultiTap operator 的职责。用户应用程序需要使用其他 VisualApplets operators 重新格式化抽头(1)。

在 VisualApplets 中实例化

该 operator 在其输出抽头上提供图像数据。此输出始终存在。单抽头相机的此值为 1,双抽头相机则需设置为 2。除了这些标准输出端口之外,您还可以为每个抽头输出专门配置一个可选的 MetaData 输出(用于 CXP 标头元数据),即对于双抽头应用,您最多可以定义 2 个 MetaDataTap 端口。在 operator 实例化期间将显示以下弹出对话框,并且可以配置为以下排列组合:

此配置相当于只有一个 O 输出且无元数据的更简单的 CxpCamera operator。

图 419。此配置相当于只有一个 O 输出且无元数据的更简单的 CxpCamera operator。


此配置相当于选择了 O 端口和 MetaDataO 端口的更简单的 CxpCamera operator。

图 420。此配置相当于选择了 O 端口和 MetaDataO 端口的更简单的 CxpCamera operator。


在此配置中,仅输出抽头 0 及其元数据。对于抽头 1,仅输出元数据。此配置对于调试相机/采集卡组合非常有用。

图 421。在此配置中,仅输出抽头 0 及其元数据。对于抽头 1,仅输出元数据。此配置对于调试相机/采集卡组合非常有用。


在此配置中,operator 在其 Tap0 和 Tap1 端口上将两个相机抽头作为 2 个单独的数据流提供。但是,不输出任何元数据信息。

图 422。在此配置中,operator 在其 Tap0 和 Tap1 端口上将两个相机抽头作为 2 个单独的数据流提供。但是,不输出任何元数据信息。


在此配置中,operator 在其 Tap0 和 Tap1 端口上将两个相机抽头作为 2 个单独的数据流提供。该 operator 还提供 Tap0 端口的元信息。此配置对于对称的相机抽头配置可能很有意义,在这种配置中,除 TapG Code 字段外,两个抽头的 CXP 标头在大部分情况下是相同的。

图 423。在此配置中,operator 在其 Tap0 和 Tap1 端口上将两个相机抽头作为 2 个单独的数据流提供。该 operator 还提供 Tap0 端口的元信息。此配置对于对称的相机抽头配置可能很有意义,在这种配置中,除 TapG Code 字段外,两个抽头的 CXP 标头在大部分情况下是相同的。


这是该 operator 的最大配置,其中为每个抽头提供其自己的输出以及其自己的元数据。

图 424。这是该 operator 的最大配置,其中为每个抽头提供其自己的输出以及其自己的元数据。


可选的 MetaDataTap 端口

两个元数据端口的格式完全相同。 它在 VisualApplets 中作为 32 位输出提供,如以下图片所示:

每个 CXP 帧都提供相应的无错误图像标头。对于不正确的图像标头,不会将任何图像流数据源入 VisualApplets 管道。压缩的图像标头由 6 个字组成。最后一个字节用于附加信息,仅供内部使用。特别是,HeaderError 位用于通知图像标头本身是否存在错误。

图像标头 描述
StreamId CXP 流的 ID
Tag 16 位源图像索引。每传输一个图像,该索引就会递增,并在达到 0xFFFF 时回环归零。包含与同一图像相关的数据的每个流(在多抽头流的情况下)应使用相同的数字。
XSize 表示以像素为单位的图像宽度的 24 位值。
XOff 表示图像相对于完整设备图像最左侧像素的水平偏移量(以像素为单位)的 24 位值。
YSize 表示图像高度(以像素为单位)的 24 位值。对于线扫图像,该值设置为 0。CameraScanMode 参数始终显示从中读取的相机类型。如果 Tap0/Tap1 Img Protocol 设置为 VALT_LINE1D,则在处理时会忽略 YSize,并且算子会将所有传入数据输出为无尽的行流。如果图像协议设置为 VALT_IMAGE2D,YSize=0 也会导致无尽的行流。
YOff 表示图像相对于完整设备图像顶行的垂直偏移量(以像素为单位)的 24 位值。对于线扫图像,该值设置为 0。
DSizeL 表示每行图像的数据字数的 24 位值。
PixelF 表示 Pixel Format 的 16 位值。
TapG 表示抽头几何结构的 16 位值。
Flags 图像标志。
x-Mirror (尚未使用)。描述传入图像是否进行了 x 镜像翻转。
y-Mirror (尚未使用)。描述传入图像是否进行了 y 镜像翻转。
HeaderError

1:图像标头出错,帧被声明为丢失。算子输出数据流中不存在相应的图像数据。

0:图像标头正确,算子输出数据流中存在相应的图像数据。

[重要] Image Protocol:面阵和线阵相机

图像协议对相机算子输出有两个不同的影响:

  • 来自 CXP 标头的 YSize 值。0 = 线扫;>0 = 面阵。

  • 运算符输出端上配置的协议 Tap0/Tap1 Img Protocol:VALT_LINE1D = 线阵扫描; VALT_IMAGE2D = 面阵扫描。

CameraScanMode 参数始终显示从 CXP 标头读取的相机类型。如果将 Tap0/Tap1 Img Protocol 设置为 VALT_LINE1D,则处理时会忽略 YSize,并且运算符会将所有传入数据输出为无尽的行流。如果图像协议设置为 VALT_IMAGE2D,则 YSize=0 同样会导致无尽的行流,从而产生超出 Tap0/Tap1 Max Img Height 的图像。过大的图像可能会在设计中跟在 CxpCamera 运算符后面的运算符中导致未定义的行为。为避免这种情况,建议将传入的行流拆分为多个图像,例如通过使用 SplitImage 运算符。

[重要] 修改图像宽度和图像高度

通过输出链接的最大图像宽度和高度 Property,您可以将宽度和高度调整为相机特定的设置。但是,运算符端口 Tap0/Tap1 上的最大图像宽度 必须能被其端口的 Parallelism 整除。因此,请确保最大图像宽度能够被端口 Tap0 和 Tap1 的 Parallelism 整除!

设备资源占用

根据参数 ConnectionCount 的选择,该运算符使用一个或多个类型为 CameraPort 的资源。对于事件 system,将使用类型为 EventPort 的资源。如果将 ConnectionCount 设置为 X4(四通道),将打开以下资源对话框:

错误处理与事件系统

当运算符检测到接收到的重建帧大于或小于相机在 CXP 图像标头中通告的大小时,将激活安全电路。然后,运算符会截断超出部分的像素和行,以便后续的处理流水线始终看到图像标头中定义的帧大小。如果接收到的帧尺寸小于图像标头中指定的大小,运算符将用未定义的数据填充接收到的帧,以达到图像标头中指定的帧尺寸。填充较小的帧可能会导致后续帧丢失。随后会将丢失情况通过事件报告给运行时软件(Framegrabber SDK)(参见下一段)。尺寸不匹配也会引发事件。

For a set of very critical errors, the operator will forward asynchronous events to the host runtime software (Framegrabber SDK). The event name in the Framegrabber API is <hierarchical operator name>\CxpStreamStatus, e.g. Device1\Process0\Camera\CxpStreamStatus. The event payload is provided as four 16-bit data words. The event format is defined as follows:

  • 字 [0]:

    • 位 [0:15]:发生事件的 CXP 图像标签。

  • 字 [1]:

    • 位 [8:15]:发生事件的流 ID (stream-ID)。

    • 位 [0:7]:保留,作为无关项 (don't care) 处理。

  • 字 [2]:

    • 位 [0]:发生 CRC 错误。

    • 位 [1]:在图像标头中检测到流标记错误。

    • 位 [2]:检测到图像标头中存在无法纠正的错误。

    • 位 [3]:检测到帧大小错误,即 CXP 图像标头中定义的图像大小与传输数据包重建的帧大小不匹配。当相机在图像标头中放入一个信息,但传输的数据量与标头中通告的不同时,就会发生这种情况。

    • 位 [4:15]:保留,作为无关项 (don't care) 处理。

  • 字 [3]:

    • 位 [0]:事件类型,0 = Corrupted Entity,1 = Lost Entity。

      • Corrupted Entity 意味着错误发生在帧内部,并且该帧已被引入 VisualApplets 流水线中。

      • Lost Entity 意味着错误发生在帧被转发到后续运算符之前,并且该帧已被相机运算符丢弃。

      • 当观测到损坏的实体时,运算符将根据 CXP 图像标头定义填充帧,以便后续运算符不会导致未定义的行为。在此填充过程中,可能会到达新帧并随后丢失。当相机根据帧标签发送带有间隙的数据时,也会引发丢失实体事件。

    • 位 [1]:发生了类型为 Corrupted Entity 的事件丢失。这意味着先前的 Corrupted Entity 类型事件丢失了。当运行时软件不对事件做出反应且内部事件队列已满时,就会发生这种情况。

    • bit [2]:发生了类型为 Lost Entity 的事件丢失。这意味着丢失了先前发生 的类型为 Lost Entity 的事件。当运行时软件没有对事件做出响应并且内部事件队列已满时,就会发生这种情况。

    • bits [3:15]:丢失的 Lost Entity 事件的数量。

事件分为两种类型:损坏实体的事件和丢失实体的事件。word 3 的 bit 0 描述了发生了哪种类型的事件。如果事件缓冲区已满,可能会导致事件丢失。当标记损坏实体的事件丢失时,word 3 的 bit 1 将被置位。当标记丢失实体的事件丢失时,word 3 的 bit 2 将被置位,且 bit 3 到 15 将提供指示丢失帧的丢失事件数量。如果 bit 2 已置位但 Counter 为 0,则意味着发生了 Counter 溢出。

每个事件都会引发一个软件中断。为了 减少事件数量,可能会将具有相同帧标记(frame tag)的多个事件合并在一起。在这种情况下,某些错误标志会被组合。如果某个事件丢失,则丢失事件之前的事件将包含有关丢失事件的信息,并且不能与具有相同帧标记的后续事件合并。

由 CRC 错误引起的事件会报告一个帧标记(frame tag),该标记可能不完全对应于发生 CRC 错误的帧。帧标记可能是前一帧或后一帧的帧标记。这种情况只会在相机发送包含 2 个或更多帧之间过渡的 CXP 数据包时发生。CRC 计算在数据包结束时完成,但流数据是即时重建的。这意味着可能会出现这种情况:仅在操作员发送前一帧之后才检测到 CRC 错误。在正常情况下,如果相机数据包不包含正在进行的帧末尾和下一帧开头的数据,则 CRC 错误期间的帧标记将始终正确。对于所有其他情况,只要完整的帧流数据小于 8k 的最大数据包大小,一个数据包内可能仅存在 1 个帧重叠。在这种情况下,软件应用程序应将带有帧标记 -1 的前一帧和带有帧标记 +1 的后一帧也视为可能已损坏。

[注意] 区分各 Tap 之间的错误事件

错误处理和事件系统对两个 CXP tap 流都是通用的。使用 Stream-ID 字段将接收到的事件与相应的 tap 关联起来。通常,Tap 0 将获得较低的 Stream-ID,通常为 0。Tap 1 将获得的 Stream-ID 大于 Tap 0 的 Stream-ID。

I/O Property

Property 值
Operator Type M
Output Links Tap0/Tap1,图像数据输出
MetaDataTap0/MetaDataTap1,可选的元数据输出

Supported Link Format

Link Parameter 输出链路 Tap0/Tap1 输出链路 MetaDataTap0/MetaDataTap1
Bit Width 8 32
Arithmetic unsigned unsigned
Parallelism auto 1
Kernel Columns 1 1
Kernel Rows 1 1
Img Protocol {VALT_IMAGE2D, VALT_LINE1D} (default: VALT_IMAGE2D)1 {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D} (default: VALT_IMAGE2D)
Color Format VAF_GRAY VAF_GRAY
Color Flavor FL_NONE FL_NONE
Max. Img Width 任意(默认:1032) 6
Max. Img Height 任意(默认:1032) 1

1

如果将 Tap0/Tap1 Img Protocol 设置为 VALT_LINE1D,则在处理时会忽略 CXP 标头中的 YSize 值,并且 算子会将所有传入数据输出为无尽的行流。如果图像 协议设置为 VALT_IMAGE2D,YSize=0(线阵相机)也会导致 无尽的行流,从而产生超出 Tap0/Tap1 Max Img Height 的图像。

参数

ConnectionCount
键入 静态写入参数
默认 X1
范围 {X1, X2, X4}

参数 ConnectionCount 定义了聚合到 CXP 链路的 CXP 通道数量。所用连接端口的索引 由类型为 CameraPort 的资源处理。 端口资源的数量与连接计数相匹配(例如 X2:两个 CameraPort 资源项)。

当您实例化多个 CxpCamera 算子(例如用于双相机 小程序)时,如果使用多个具有相同索引的资源,或者消耗的 CameraPort 资源数量超过最大值 4,则可能会发生资源冲突。在这种情况下,设计规则检查会报告错误。

[注意] 所有参数对两个 Tap 均通用

所有参数对两个 Tap 均通用,即 ConnectionCount 参数计算两个 tap 流中使用的 连接端口。

ResetStatus
键入 动态写入参数
默认 熄灭
范围 {Off, On}

参数 ResetStatus 用于重置相机统计信息, 即错误计数器。

[注意] 所有参数对两个 Tap 均通用

所有参数对两个 Tap 均通用,即 ResetStatus 参数重置两个 tap 流中的相机 统计信息。

UsedConnections
键入 动态读取参数
默认
范围 {1,2,4}

参数 UsedConnections 显示了由发现软件在运行时配置的 CXP 通道数量。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头(tap)都是公用的,即 UsedConnections 参数表示跨两个抽头流配置的端口。

PacketTagErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

参数 PacketTagErrorCount 用于显示收到的数据包中,有多少个数据包的标签不符合 CXP 标准所期望的标签。特别是,当后续流数据包标签枚举中出现间隙时,该参数会向上计数。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项(don't care)。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即 PacketTagErrorCount 参数用于统计跨两个抽头流的不符合预期标签的数据包数量。

ImageTagErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计图像头部标签、根据 CXP 标准预期的标签以及收到的标签之间出现多少次不匹配。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即 ImageTagErrorCount 参数用于统计跨两个抽头流的标签不匹配情况。

StreamIdErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计流数据包中收到的流 ID 值与图像头部中指定的流 ID 值不匹配的频率。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即 StreamIdErrorCount 参数用于统计跨两个抽头流的流 ID。

CorrectedErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计图像头部或行标记中检测到的多少个错误已被纠正。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

UncorrectedErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计由于同一字节中存在多个位错误而无法纠正的图像头部或行标记中检测到的错误数量。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即错误监控参数表示跨两个抽头流的对应错误类型的总和。

PacketBufferOverflowCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计聚合模式下通道绑定中发生数据包缓冲区溢出的频率。该参数仅对 ConnectionCount = X2 或 X4 有效。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即 PacketBufferOverflowCount 参数用于统计跨两个抽头流的数据包缓冲区溢出情况。

PacketBufferOverflowSource
键入 动态读取参数
默认
范围 [0x0 : 0xf]

该参数实现了一个位掩码,用于查询数据包缓冲区溢出发生在 4 个潜在 CXP 通道中的哪一个。参数宽度取决于参数 ConnectionCount。在 X1 模式下,参数宽度为 1 位;在 X2 模式下,参数宽度为 2 位;在 X4 模式下,参数宽度为 4 位。顺序为:LSB = 最低 CXP 通道号,MSB = 操作员分配的最高 CXP 通道号。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即 PacketBufferOverflowSource 参数用于搜索跨两个抽头流的溢出情况。

CameraScanMode
键入 动态读取参数
默认
范围 {area,line}

接收到的图像标头带有该流是用于面阵(YSize > 0)还是线阵(YSize = 0)应用的信息。此参数显示最后一次有效接收到的流图像标头信息。

读取此参数时仅针对 Tap0 流,并假设 Tap1 流处于完全相同的模式。这意味着此参数适用于整个相机的面阵或线阵,因此对于两个抽头(tap)是相同的,并非特定于某个抽头。

MarkerErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计 CXP 流标记与标头或行标记的序列错误的发生次数。该参数宽度为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 表示 Counter 溢出。当设置了溢出位时,应忽略 Counter 值。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即错误监控参数表示跨两个抽头流的对应错误类型的总和。

UnexpectedStartupData
键入 动态读取参数
默认
范围 {false, true}

该参数用于检测在算子重置后第一个数据值出现异常的错误情况,即此前未接收到图像标头。这种情况可能是由相机漏洞、采集卡固件实现缺陷或发现过程的软件控制错误引起的。理论上,相机的硬件故障也可能导致这种情况。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是公用的,即错误监控参数表示跨两个抽头流的对应错误类型的总和。

FrameLostCount
键入 动态读取参数
默认
范围 [0 : 33554431]

该参数用于统计在采集过程中丢失且未发送到 VisualApplets 流水线中的帧数。当检测到图像标头错误或一帧与另一帧重叠时,帧会丢失。该参数宽度为 25 位,其中位 [23:0] 表示实际的 Counter 值,位 [24] 表示 Counter 溢出。当设置了溢出位时,应忽略 Counter 值。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是通用的,即 FrameLostCount 参数统计的是跨两个抽头流丢失的总帧数。

FrameCorruptedCount
键入 动态读取参数
默认
范围 [0 : 33554431]

该参数用于统计采集过程中损坏的帧数。损坏的帧是指带有错误像素并被发送到 VisualApplets 流水线中的帧。该参数宽度为 25 位,其中位 [23:0] 表示实际的 Counter 值,位 [24] 表示 Counter 溢出。当设置了溢出位时,应忽略 Counter 值。

[注意] 所有参数对两个 Tap 均通用

所有参数对于两个抽头都是通用的,即 FrameCorruptedCount 参数统计的是跨两个抽头流损坏的总帧数。

使用示例

以下示例展示了算子 CxpCameraMultiTap 的使用方法: